#include <logbase.h>
#include <stdarg.h>
#include <fcntl.h> // file option
#include <errno.h>

typedef struct
{
    int intBufLen;
    int *intBufPtr;
} myIntBufStc;

#define chkIntPtrSize (sizeof(int) * 1)

int intBufInit(myIntBufStc *mybuf, int cfglen)
{
    if(!mybuf)
    {
        logerrorc("null ptr!");
        return -1;
    }
    mybuf->intBufLen = 0;
    mybuf->intBufPtr = NULL;
    if(!(cfglen > 0 && cfglen < 1000000))
    {
        logerrorc("size error:%d", cfglen);
        return -1;
    }
    mybuf->intBufPtr = (int *)malloc(sizeof(int) * cfglen);
    if(!mybuf->intBufPtr)
    {
        logerrorc("malloc error:%d!", cfglen);
        return -1;
    }
    return (mybuf->intBufLen = cfglen);
}

void intBufFree(myIntBufStc *mybuf);
int intBufDeepCopy(myIntBufStc *outbuf, const myIntBufStc *inbuf)
{
    if(!outbuf)
    {
        logerrorc("out null ptr!");
        return -1;
    }
    intBufFree(outbuf);
    if(!inbuf)
    {
        logerrorc("in null ptr!");
        return -1;
    }

    outbuf->intBufPtr = (int *)malloc(sizeof(int) * inbuf->intBufLen);
    if(!outbuf->intBufPtr)
    {
        logerrorc("malloc error:%d!", inbuf->intBufLen);
        return -1;
    }
    memcpy(outbuf->intBufPtr, inbuf->intBufPtr, inbuf->intBufLen);
    return (outbuf->intBufLen = inbuf->intBufLen);
}


void intBufFree(myIntBufStc *mybuf)
{
    if(!mybuf)
    {
        logerrorc("null ptr!");
        return;
    }
    mybuf->intBufLen = 0;
    if(mybuf->intBufPtr)
    {
        free(mybuf->intBufPtr);
        mybuf->intBufPtr = NULL;
    }
}

int main(int argc, char **argv)
{
    myIntBufStc tmpsl;
    intBufInit(&tmpsl, 10);
    if(tmpsl.intBufLen < 10)
    {
        logerrorc("");
        return -1;
    }
    tmpsl.intBufPtr[0] = 101;
    logdebugc("origin ptr info:ptr=%p,len=%d", tmpsl.intBufPtr, tmpsl.intBufLen);
    {
        myIntBufStc tmpibs1 = {0};//{0}将结构体所有成员赋值为0．
        //　可以看到，tmpibs1.intBufPtr和tmpsl.intBufPtr分配了不同空间，这就是深拷贝．
        intBufDeepCopy(&tmpibs1, &tmpsl);
        logdebugc("deep copy ptr info:ptr=%p,len=%d", tmpibs1.intBufPtr, tmpibs1.intBufLen);

        intBufFree(&tmpsl);
        logdebugc("origin after free info:ptr=%p,len=%d", tmpsl.intBufPtr, tmpsl.intBufLen);

        // 原始数据被释放．因为tmpibs1.intBufPtr空间是独立的，它还能继续使用，直到他被释放．
        logdebugc("deep copy now info:ptr=%p,len=%d", tmpibs1.intBufPtr, tmpibs1.intBufLen);
        logdebugc("deep copy now info:ptrval=%d", tmpibs1.intBufPtr[0]);
        // 他有自己空间，释放正常！
        intBufFree(&tmpibs1);
    }
    return 1;
}
